package qqserver.service;

import qqcommon.Message;
import qqcommon.MessageType;
import qqcommon.User;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;

//客户端服务
public class QQServer {
    private ServerSocket serverSocket = null;
    //    构造器
    public QQServer() {
        try {
//            监听本机的9999端口
            serverSocket = new ServerSocket(9999);
            System.out.println("服务端启动，监听本机的9999端口");
            new SendServerMessageThread().start();//开启服务端消息推送服务
//            循环监听
            while (true) {
//                如果客户端有连接服务端的此端口，则会创建socket对象，否则服务端会阻塞
                Socket socket = serverSocket.accept();
//                获取客户端发来的user对象
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                User user = (User) ois.readObject();
//                 创建校验登录反馈的Message
                Message message = new Message();

//                校验登录的用户
                if (checkUser(user)) {//用户信息校验成功
                    message.setMesType(MessageType.MESSAGE_LOGIN_SUCCESS);
                } else {
                    message.setMesType(MessageType.MESSAGE_LOGIN_FAIL);
                }
                //                    反馈用户登录校验结果
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                oos.writeObject(message);

//                登录成功的业务逻辑
                if (MessageType.MESSAGE_LOGIN_SUCCESS.equals(message.getMesType())) {
//                创建服务端的线程
                    ServerConnectThread serverConnecThread = new ServerConnectThread(socket);
                    serverConnecThread.start();//开启服务端线程
//                    将服务端线程添加到集合中进行管理
                    ManageServerConnectThread.addServerConnectThread(user.getId(), serverConnecThread);
                }else{
                    socket.close();//登录失败，关闭socket
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //    用集合模拟用户数据库,存储数据表中的用户的账号和密码
    private static ConcurrentHashMap<String, String> users = new ConcurrentHashMap<>(16);

    static {
        users.put("100", "123456");
        users.put("200", "123456");
        users.put("300", "123456");
        users.put("400", "123456");
        users.put("哈哈", "123456");
    }

    /**
     * 校验要登录的用户是否存在
     *
     * @param user
     * @return 校验结果
     */
    public boolean checkUser(User user) {
        if (user == null) {
            return false;
        } else if (users.get(user.getId()) == null) {
            System.out.println("用户：" + user.getId() + " 不存在");
            return false;
        } else if (!users.get(user.getId()).equals(user.getPassWord())) {
            System.out.println("用户：" + user.getId() + " 的密码校验错误");
            return false;
        }
        System.out.println("用户：" + user.getId() + " 登录成功");
        return true;
    }


    /**
     * 由线程集合获取在线用户列表
     * @return
     */
    public static String getOnlineUser() {
        Enumeration<String> userids = ManageServerConnectThread.getHsm().keys();
        Iterator<String> it = userids.asIterator();
        StringBuilder str = new StringBuilder();
        while (it.hasNext()) {
            str.append(it.next() + " ");
        }
        return new String(str);//返回在线用户列表，用户之间由空格分隔
    }


}
